home *** CD-ROM | disk | FTP | other *** search
/ Delphi Developer's Kit 1996 / Delphi Developer's Kit 1996.iso / power / cntrpanl / cntrpanl.pas next >
Pascal/Delphi Source File  |  1995-12-22  |  4KB  |  141 lines

  1. {========
  2. Newsgroups: comp.lang.pascal.delphi.components
  3. Subject: Free Component: TCenterPanel!!
  4. From: dhuff@solar.sky.net ()
  5. Date: 23 Aug 1995 18:23:39 GMT
  6.  
  7. Greetings,
  8.  
  9. I've been developing custom components, and would like
  10. to share the fruits of labor.  Following is the source
  11. code to TCenterPanel.
  12.  
  13. I had a number of dialogs with Okay and Cancel buttons
  14. (some just had Cancel,) within a TPanel aligned at the
  15. bottom of the forms.  I wanted to make these buttons
  16. stay centered when the form (and hence the TPanel) was
  17. resized.  Instead of writing the routine and copying the
  18. code everywhere I needed it (ala VB), I derived a
  19. component from TPanel that horizontally centers all
  20. components within it.
  21.  
  22. Differences from TPanel:
  23.    BufferSpace Integer property that defines the leftmost
  24.       extent to which the child controls will be moved.
  25.       This is handy because as the panel is sized down,
  26.       the controls may move over the left side of your
  27.       bevel and look cheesy.
  28.  
  29. Send me a mail if you like it, extend it, learn from it,
  30. or otherwise use it.
  31.  
  32. Regards,
  33.  
  34. Don Huff
  35. dhuff@sky.net
  36. }
  37.  
  38. unit CentrPnl;
  39.  
  40. interface
  41.  
  42. uses
  43.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  44.   Forms, Dialogs, ExtCtrls;
  45.  
  46. type
  47.   TCenterPanel = class(TPanel)
  48.   private
  49.     { Private declarations }
  50.     FBufferSpace : Integer;
  51.  
  52.     procedure SetBufferSpace(Value: Integer);
  53.   protected
  54.     { Protected declarations }
  55.     procedure Resize; override;
  56.   public
  57.     { Public declarations }
  58.     constructor Create(AOwner : TComponent); override;
  59.   published
  60.     { Published declarations }
  61.     property BufferSpace : Integer read FBufferSpace write SetBufferSpace default 0;
  62.   end;
  63.  
  64. procedure Register;
  65.  
  66. implementation
  67.  
  68. procedure Register;
  69. begin
  70.   RegisterComponents('Samples', [TCenterPanel]);
  71. end;
  72.  
  73. constructor TCenterPanel.Create(AOwner : TComponent);
  74. begin
  75.   inherited Create(AOwner);
  76.   FBufferSpace := 0;  {init default}
  77. end;  {Create}
  78.  
  79. procedure TCenterPanel.Resize;
  80. var
  81.   CenterLeft,         {the space needed on the left to exactly center all child controls}
  82.   ControlLeft,        {placeholder for left edge value of current control}
  83.   ControlRight,       {placeholder for right edge value of current control}
  84.   DeltaLeft,          {amount we need to add to each control's left property to center it}
  85.   I,                  {general purpose index for our loops}
  86.   MaxControlIdx,      {the maximum valid index in the Controls array}
  87.   MaxRight,           {the rightmost point of all child controls}
  88.   MinLeft : Integer;  {the leftmost point of all child controls}
  89. begin
  90.   inherited ReSize;  {do default handling}
  91.  
  92.   MaxControlIdx := ControlCount - 1;
  93.  
  94.   if MaxControlIdx >= 0 then begin
  95.     {Get the leftmost point and rightmost point of all controls}
  96.     MinLeft := Controls[0].Left;
  97.     MaxRight := MinLeft + Controls[0].Width;
  98.  
  99.     for I := 1 to MaxControlIdx do begin
  100.       ControlLeft := Controls[I].Left;
  101.       if ControlLeft < MinLeft then
  102.         MinLeft := ControlLeft;
  103.  
  104.       ControlRight := ControlLeft + Controls[I].Width;
  105.       if ControlRight > MaxRight then
  106.         MaxRight := ControlRight;
  107.  
  108.     end;
  109.  
  110.     {figure space on left side to exactly center all controls
  111.       Note: may be negative (panel is smaller than controls)}
  112.     CenterLeft := (Width - MaxRight + MinLeft) div 2;
  113.  
  114.     if CenterLeft < FBufferSpace then
  115.       {if amount to center is smaller than FBufferSpace, move to FBufferSpace}
  116.       DeltaLeft := FBufferSpace - MinLeft
  117.     else
  118.       {if amount to center is greater than FBufferSpace, move to CenterLeft}
  119.       DeltaLeft := CenterLeft - MinLeft;
  120.  
  121.     {adjust all controls the same amount}
  122.     for I := 0 to MaxControlIdx do
  123.       Controls[I].Left := Controls[I].Left + DeltaLeft;
  124.  
  125.   end;  {if MaxControlIdx >= 0}
  126.  
  127. end;  {Resize}
  128.  
  129. procedure TCenterPanel.SetBufferSpace(Value: Integer);
  130. begin
  131.   {do not allow negative values}
  132.   if Value < 0 then
  133.     Value := 0;
  134.  
  135.   FBufferSpace := Value;
  136.  
  137. end;  {SetBufferSpace}
  138.  
  139. end.
  140.  
  141.